In this notebook, we conduct additional analyses for Study 1: In-depth interviews with people of faith (not reported in the main text or the Supplemental Information of the paper).

source("../../scripts_general/dependencies.R")
source("../../scripts_general/custom_funs.R")
source("../../scripts_general/var_recode_contrast.R")
source("../scripts_s1/s1_var_groups.R")
source("../../scripts_general/data_load.R")
Parsed with column specification:
cols(
  .default = col_double(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  site = col_character(),
  religion = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character(),
  study = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  quad = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_school = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character(),
  godexpviaawe_freq = col_character(),
  sleephabit = col_character(),
  researcher_date = col_date(format = ""),
  researcher_notes = col_character(),
  site = col_character(),
  religion = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  ctry = col_character(),
  wher = col_character(),
  recr = col_character(),
  whoc = col_character(),
  demo_chur = col_character(),
  demo_ethn = col_character(),
  demo_maj = col_character(),
  demo_pocc = col_character(),
  demo_rlgn = col_character(),
  demo_sex = col_character()
)
See spec(...) for full column specifications.
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_character(),
  X1 = col_double(),
  epi_subj = col_double(),
  epi_demo_age = col_double(),
  epi_demo_ses_num = col_double(),
  epi_demo_howr_num = col_double(),
  epi_demo_affr_num = col_double(),
  epi_demo_tung_num = col_double(),
  epi_demo_ytng_num = col_double(),
  epi_demo_affr_cat = col_logical(),
  epi_demo_tung_cat = col_logical(),
  epi_demo_ytng_cat = col_logical(),
  epi_version = col_double(),
  epi_charc = col_double()
)
See spec(...) for full column specifications.
2 parsing failures.
 row       col expected  actual                           file
1025 epi_charc a double Unclear '../../study3/data/d_demo.csv'
1027 epi_charc a double Unclear '../../study3/data/d_demo.csv'
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Joining, by = c("epi_ctry", "epi_subj", "question", "response", "order", "question_text")
Joining, by = c("epi_ctry", "epi_subj")
Column `epi_ctry` joining character vector and factor, coercing into character vectorJoining, by = "epi_subj"
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_double(),
  p7_ctry = col_character(),
  p7_abs_check = col_character(),
  p7_dse_check = col_character(),
  p7_se_check = col_character(),
  p7_unev_check = col_character(),
  p7_exsen_check = col_character(),
  p7_por_check = col_character(),
  p7_mm_check = col_character(),
  p7_dem_sex = col_character(),
  p7_dem_pocc = col_character(),
  p7_dem_major = col_character(),
  p7_dem_ethnicity = col_character(),
  p7_dem_rur.urb = col_character(),
  p7_dem_affrd.basics = col_character(),
  p7_dem_religion = col_character(),
  p7_dem_church = col_character(),
  p7_dem_holy.tung.gif = col_character(),
  p7_abs_child.exp_cat = col_logical(),
  p7_abs_poetic_cat = col_logical(),
  p7_abs_tv.real_cat = col_logical()
  # ... with 162 more columns
)
See spec(...) for full column specifications.
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")

More on recoding (“QTS2”)

d1r_byquestion <- read_csv("../data/study1r_byquestion.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  researcher = col_character(),
  country = col_character(),
  quad = col_character(),
  religion = col_character(),
  coder = col_character(),
  site = col_character()
)
See spec(...) for full column specifications.
d1r <- read_csv("../data/study1r.csv") %>%
  rename_at(vars(contains("score")), funs(gsub("score", "recoded", .))) %>%
  full_join(d1) %>%
  mutate(country = factor(country, levels = levels_country),
         site = factor(site, levels = levels_site),
         religion = factor(religion, levels = levels_religion),
         researcher = factor(researcher, levels = levels_researcher))
Parsed with column specification:
cols(
  researcher = col_character(),
  country = col_character(),
  site = col_character(),
  religion = col_character(),
  coder = col_character(),
  subject_id = col_double(),
  spirit_score = col_double(),
  other_score = col_double(),
  study = col_character(),
  spirit_score_std = col_double(),
  other_score_std = col_double(),
  spirit_score_std2 = col_double(),
  other_score_std2 = col_double()
)
Joining, by = c("researcher", "country", "site", "religion", "subject_id", "study")
Column `researcher` joining character vector and factor, coercing into character vectorColumn `country` joining character vector and factor, coercing into character vectorColumn `site` joining character vector and factor, coercing into character vectorColumn `religion` joining character vector and factor, coercing into character vector
contrasts(d1r$country) <- contrasts_country
contrasts(d1r$site) <- contrasts_site
contrasts(d1r$religion) <- contrasts_religion

Averages, by score

d1r %>% 
  select(country, subject_id, ends_with("recoded"), ends_with("score")) %>%
  gather(scale, score, -c(country, subject_id)) %>%
  filter(grepl("spirit", scale) | grepl("other", scale)) %>%
  mutate(score_type = case_when(grepl("recoded", scale) ~ "recoded",
                                grepl("score", scale) ~ "original",
                                TRUE ~ NA_character_),
         score_type = factor(score_type, levels = c("original", "recoded")),
         scale = case_when(grepl("spirit", scale) ~ "spiritual experiences",
                           grepl("other", scale) ~ "other extraordinary experiences",
                           TRUE ~ NA_character_),
         scale = factor(scale, levels = c("spiritual experiences", 
                                          "other extraordinary experiences"))) %>%
  ggplot(aes(x = scale, y = score, group = score_type)) +
  # geom_point(aes(color = score_type), alpha = 0.2,
  #            position = position_jitterdodge(jitter.width = 0.1,
  #                                            dodge.width = 0.5,
  #                                            jitter.height = 0.04)) +
  geom_pointrange(data = . %>%
                    group_by(scale, score_type) %>%
                    langcog::multi_boot_standard(col = "score", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper, fill = score_type),
                  position = position_dodge(width = 0.5),
                  shape = 21, fatten = 6) +
  labs(title = "Comparing recoded scores (QTS2) to original scores (QTS1)",
       x = "Scale", y = "Score (range: 0-1)",
       fill = "Score type")

lmer(score ~ score_type * scale + (1 | subject_id), 
   data = d1r %>% 
     select(country, subject_id, ends_with("recoded"), ends_with("score")) %>%
     gather(scale, score, -c(country, subject_id)) %>%
     filter(grepl("spirit", scale) | grepl("other", scale)) %>%
     mutate(score_type = case_when(grepl("recoded", scale) ~ "recoded",
                                   grepl("score", scale) ~ "original",
                                   TRUE ~ NA_character_),
            score_type = factor(score_type, levels = c("original", "recoded")),
            scale = case_when(grepl("spirit", scale) ~ "spiritual experiences",
                              grepl("other", scale) ~ "other extraordinary experiences",
                              TRUE ~ NA_character_),
            scale = factor(scale, levels = c("spiritual experiences", 
                                             "other extraordinary experiences"))),
   contrasts = list(score_type = "contr.sum", scale = "contr.sum")) %>%
  summary()
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: score ~ score_type * scale + (1 | subject_id)
   Data: 
d1r %>% select(country, subject_id, ends_with("recoded"), ends_with("score")) %>%  
    gather(scale, score, -c(country, subject_id)) %>% filter(grepl("spirit",  
    scale) | grepl("other", scale)) %>% mutate(score_type = case_when(grepl("recoded",  
    scale) ~ "recoded", grepl("score", scale) ~ "original", TRUE ~  
    NA_character_), score_type = factor(score_type, levels = c("original",  
    "recoded")), scale = case_when(grepl("spirit", scale) ~ "spiritual experiences",  
    grepl("other", scale) ~ "other extraordinary experiences",  
    TRUE ~ NA_character_), scale = factor(scale, levels = c("spiritual experiences",  
    "other extraordinary experiences")))

REML criterion at convergence: 362.7

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.37869 -0.68474  0.01642  0.55450  2.82615 

Random effects:
 Groups     Name        Variance Std.Dev.
 subject_id (Intercept) 0.04320  0.2078  
 Residual               0.05204  0.2281  
Number of obs: 1336, groups:  subject_id, 341

Fixed effects:
                     Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)         4.251e-01  1.289e-02  3.416e+02  32.992  < 2e-16 ***
score_type1        -4.429e-03  6.269e-03  1.003e+03  -0.706 0.480112    
scale1              2.433e-02  6.252e-03  9.972e+02   3.892 0.000106 ***
score_type1:scale1  6.545e-03  6.246e-03  9.954e+02   1.048 0.294921    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scr_t1 scale1
score_type1  0.004              
scale1      -0.006  0.006       
scr_typ1:s1  0.003 -0.010  0.003
d1r %>% 
  select(country, subject_id, ends_with("recoded"), ends_with("score")) %>%
  gather(scale, score, -c(country, subject_id)) %>%
  filter(grepl("spirit", scale) | grepl("other", scale)) %>%
  mutate(score_type = case_when(grepl("recoded", scale) ~ "recoded",
                                grepl("score", scale) ~ "original",
                                TRUE ~ NA_character_),
         score_type = factor(score_type, levels = c("original", "recoded")),
         scale = case_when(grepl("spirit", scale) ~ "spiritual exp.",
                           grepl("other", scale) ~ "other exp.",
                           TRUE ~ NA_character_),
         scale = factor(scale, levels = c("spiritual exp.", 
                                          "other exp."))) %>%
  ggplot(aes(x = scale, y = score, group = score_type)) +
  facet_grid(~ country) +
  # geom_point(aes(color = score_type), alpha = 0.2,
  #            position = position_jitterdodge(jitter.width = 0.1,
  #                                            dodge.width = 0.5,
  #                                            jitter.height = 0.04)) +
  geom_pointrange(data = . %>%
                    group_by(scale, score_type, country) %>%
                    langcog::multi_boot_standard(col = "score", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper, fill = score_type),
                  position = position_dodge(width = 0.5),
                  shape = 21, fatten = 6) +
  labs(title = "Comparing recoded scores (QTS2) to original scores (QTS1)",
       x = "Scale", y = "Score (range: 0-1)",
       fill = "Score type") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

d1r %>% 
  select(country, site, religion, subject_id, 
         ends_with("recoded"), ends_with("score")) %>%
  gather(scale, score, -c(country, site, religion, subject_id)) %>%
  filter(grepl("spirit", scale) | grepl("other", scale)) %>%
  mutate(score_type = case_when(grepl("recoded", scale) ~ "recoded",
                                grepl("score", scale) ~ "original",
                                TRUE ~ NA_character_),
         score_type = factor(score_type, levels = c("original", "recoded")),
         scale = case_when(grepl("spirit", scale) ~ "spiritual exp.",
                           grepl("other", scale) ~ "other exp.",
                           TRUE ~ NA_character_),
         scale = factor(scale, levels = c("spiritual exp.", 
                                          "other exp."))) %>%
  ggplot(aes(x = scale, y = score, group = score_type)) +
  facet_grid(rows = vars(site, religion), cols = vars(country)) +
  geom_point(aes(color = score_type), alpha = 0.2,
             position = position_jitterdodge(jitter.width = 0.1,
                                             dodge.width = 0.5,
                                             jitter.height = 0.04)) +
  geom_pointrange(data = . %>%
                    group_by(scale, score_type, country, site, religion) %>%
                    langcog::multi_boot_standard(col = "score", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper, fill = score_type),
                  position = position_dodge(width = 0.5),
                  shape = 21, fatten = 6) +
  labs(title = "Comparing recoded scores (QTS2) to original scores (QTS1)",
       x = "Scale", y = "Score (range: 0-1)",
       fill = "Score type", color = "Score type") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

d1r %>% 
  select(country, subject_id, coder, ends_with("recoded")) %>%
  gather(scale, score, -c(country, subject_id, coder)) %>%
  mutate(score_type = case_when(grepl("recoded", scale) ~ "recoded",
                                grepl("score", scale) ~ "original",
                                TRUE ~ NA_character_),
         score_type = factor(score_type, levels = c("original", "recoded")),
         scale = case_when(grepl("spirit", scale) ~ "spiritual exp.",
                           grepl("other", scale) ~ "other exp.",
                           TRUE ~ NA_character_),
         scale = factor(scale, levels = c("spiritual exp.", 
                                          "other exp."))) %>%
  filter(grepl("spirit", scale) | grepl("other", scale)) %>%
  ggplot(aes(x = scale, y = score, group = coder)) +
  facet_grid(~ country) +
  geom_point(aes(color = coder), alpha = 0.2,
             position = position_jitterdodge(jitter.width = 0.1,
                                             dodge.width = 0.5,
                                             jitter.height = 0.04)) +
  geom_pointrange(data = . %>%
                    group_by(scale, coder, country) %>%
                    langcog::multi_boot_standard(col = "score", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper, fill = coder),
                  shape = 21, fatten = 5,
                  position = position_dodge(width = 0.5)) +
  labs(title = "Comparing coders in recoded dataset (QTS2)",
       x = "Scale", y = "Score (range: 0-1)", fill = "Coder", color = "Coder") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

lmer(score ~ scale * coder + (1 | subject_id), 
   data = d1r %>% 
     select(country, coder, subject_id, ends_with("recoded")) %>%
     distinct() %>%
     gather(scale, score, -c(country, subject_id, coder)) %>%
     filter(grepl("spirit", scale) | grepl("other", scale)) %>%
     mutate(scale = case_when(grepl("spirit", scale) ~ "spiritual experiences",
                              grepl("other", scale) ~ "other extraordinary experiences",
                              TRUE ~ NA_character_),
            scale = factor(scale, levels = c("spiritual experiences", 
                                             "other extraordinary experiences")),
            coder = factor(coder, levels = c("Nikki", "Maria", "Lucy"))),
   contrasts = list(scale = "contr.sum", 
                    coder = cbind("_NvGM" = c(1, 0, -1),
                                  "_MvGM" = c(0, 1, -1)))) %>%
  summary()
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: score ~ scale * coder + (1 | subject_id)
   Data: d1r %>% select(country, coder, subject_id, ends_with("recoded")) %>%  
    distinct() %>% gather(scale, score, -c(country, subject_id,  
    coder)) %>% filter(grepl("spirit", scale) | grepl("other",  
    scale)) %>% mutate(scale = case_when(grepl("spirit", scale) ~  
    "spiritual experiences", grepl("other", scale) ~ "other extraordinary experiences",  
    TRUE ~ NA_character_), scale = factor(scale, levels = c("spiritual experiences",  
    "other extraordinary experiences")), coder = factor(coder,  
    levels = c("Nikki", "Maria", "Lucy")))

REML criterion at convergence: 328.5

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.76292 -0.68127  0.03902  0.47704  2.27078 

Random effects:
 Groups     Name        Variance Std.Dev.
 subject_id (Intercept) 0.02397  0.1548  
 Residual               0.06998  0.2645  
Number of obs: 671, groups:  subject_id, 340

Fixed effects:
                   Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)         0.42875    0.01515 341.70286  28.298  < 2e-16 ***
scale1              0.02745    0.01174 339.27621   2.338  0.01995 *  
coder_NvGM          0.02927    0.01839 340.24072   1.591  0.11246    
coder_MvGM         -0.06042    0.02038 340.51182  -2.965  0.00324 ** 
scale1:coder_NvGM  -0.03378    0.01423 337.85385  -2.374  0.01818 *  
scale1:coder_MvGM   0.01857    0.01577 338.11808   1.178  0.23978    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scale1 cd_NGM cd_MGM s1:_NG
scale1      -0.022                            
coder_NvGM  -0.434  0.015                     
coder_MvGM  -0.142  0.008 -0.173              
scl1:cd_NGM  0.015 -0.437 -0.017 -0.004       
scl1:cd_MGM  0.008 -0.145 -0.004 -0.018 -0.169
d1r %>% 
  select(country, site, religion, subject_id, coder, ends_with("recoded")) %>%
  gather(scale, score, -c(country, site, religion, subject_id, coder)) %>%
  mutate(score_type = case_when(grepl("recoded", scale) ~ "recoded",
                                grepl("score", scale) ~ "original",
                                TRUE ~ NA_character_),
         score_type = factor(score_type, levels = c("original", "recoded")),
         scale = case_when(grepl("spirit", scale) ~ "spiritual exp.",
                           grepl("other", scale) ~ "other exp.",
                           TRUE ~ NA_character_),
         scale = factor(scale, levels = c("spiritual exp.", 
                                          "other exp."))) %>%
  filter(grepl("spirit", scale) | grepl("other", scale)) %>%
  ggplot(aes(x = scale, y = score, group = coder)) +
  facet_grid(rows = vars(site, religion), cols = vars(country)) +
  geom_point(aes(color = coder), alpha = 0.2,
             position = position_jitterdodge(jitter.width = 0.1,
                                             dodge.width = 0.5,
                                             jitter.height = 0.04)) +
  geom_pointrange(data = . %>%
                    group_by(scale, coder, country, site, religion) %>%
                    langcog::multi_boot_standard(col = "score", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper, fill = coder),
                  shape = 21, fatten = 5,
                  position = position_dodge(width = 0.5)) +
  geom_text(data = . %>% count(country, site, religion, coder, scale),
             aes(y = 0, label = paste0("n=", n), color = coder), 
            position = position_dodge(width = 1)) +
  labs(title = "Comparing coders in recoded dataset (QTS2)",
       x = "Scale", y = "Score (range: 0-1)", fill = "Coder", color = "Coder") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

Averages, by question

d1r_byquestion %>% 
  select(country, site, religion, subject_id, 
         !!s1_var_spirit, !!s1_var_other) %>%
  gather(question, recoded, -c(country, site, religion, subject_id)) %>%
  full_join(d1_byquestion %>%
              select(country, site, religion, subject_id, 
                     !!s1_var_spirit, !!s1_var_other) %>%
              gather(question, original, -c(country, site, religion, subject_id))) %>%
  gather(response_type, response, c(original, recoded)) %>%
  mutate(question = factor(question, levels = c(s1_var_spirit, s1_var_other)),
         response_type = factor(response_type, levels = c("original", "recoded"))) %>%
  ggplot(aes(x = question, y = response, group = response_type)) +
  geom_pointrange(data = . %>%
                    group_by(question, response_type) %>%
                    langcog::multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper,
                      fill = response_type),
                  position = position_dodge(width = 0.5),
                  shape = 21, fatten = 6) +
  labs(title = "Comparing recoded scores (QTS2) to original scores (QTS1)",
       x = "Question", y = "Response (range: 0-1)",
       fill = "Response type") +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
Joining, by = c("country", "site", "religion", "subject_id", "question")
Column `country` joining character vector and factor, coercing into character vectorColumn `site` joining character vector and factor, coercing into character vectorColumn `religion` joining character vector and factor, coercing into character vector

d1r_byquestion %>% 
  select(country, site, religion, subject_id, 
         !!s1_var_spirit, !!s1_var_other) %>%
  gather(question, recoded, -c(country, site, religion, subject_id)) %>%
  full_join(d1_byquestion %>%
              select(country, site, religion, subject_id, 
                     !!s1_var_spirit, !!s1_var_other) %>%
              gather(question, original, -c(country, site, religion, subject_id))) %>%
  gather(response_type, response, c(original, recoded)) %>%
  mutate(question = factor(question, levels = c(s1_var_spirit, s1_var_other)),
         response_type = factor(response_type, levels = c("original", "recoded"))) %>%
  filter(question == "seehearnotgod") %>%
  count(response_type, response) %>%
  spread(response, n)
Joining, by = c("country", "site", "religion", "subject_id", "question")
Column `country` joining character vector and factor, coercing into character vectorColumn `site` joining character vector and factor, coercing into character vectorColumn `religion` joining character vector and factor, coercing into character vector
d1r_byquestion %>% 
  select(country, site, religion, subject_id, 
         !!s1_var_spirit, !!s1_var_other) %>%
  gather(question, recoded, -c(country, site, religion, subject_id)) %>%
  full_join(d1_byquestion %>%
              select(country, site, religion, subject_id, 
                     !!s1_var_spirit, !!s1_var_other) %>%
              gather(question, original, -c(country, site, religion, subject_id))) %>%
  mutate(question = factor(question, levels = c(s1_var_spirit, s1_var_other))) %>%
  filter(question == "seehearnotgod") %>%
  mutate(match = (original == recoded)) %>%
  count(match) %>%
  mutate(prop = n/sum(n))
Joining, by = c("country", "site", "religion", "subject_id", "question")
Column `country` joining character vector and factor, coercing into character vectorColumn `site` joining character vector and factor, coercing into character vectorColumn `religion` joining character vector and factor, coercing into character vector

Comparing first question to interviewer judgments when available

d1_check_questions <- c("godvoxaloud", "godviavisions", "godviatouch", 
                        "godviasmell", "neartangiblegod", "presencenotgod", 
                        "presencedemon", "beingentbody", "seehearnotgod", 
                        "whitelight", "spiritbeingencounter", "voxwhenalone", 
                        "seethingscornereye")
d1_check <- d1_byquestion %>% 
  select(country, subject_id, ends_with("_judge")) %>%
  gather(question, judgment, -c(country, subject_id)) %>%
  mutate(question = gsub("_judge", "", question)) %>%
  full_join(d1_byquestion %>% 
              select(country, subject_id, !!d1_check_questions) %>%
              gather(question, response, -c(country, subject_id)))
Joining, by = c("country", "subject_id", "question")
d1_check %>%
  filter(question %in% d1_check_questions) %>%
  mutate(agree = (judgment == response),
         agree = ifelse(is.na(agree), 0, agree)) %>%
  group_by(question) %>%
  summarise(percent_agree = mean(agree, na.rm = T)) %>%
  arrange(percent_agree)
s1_check_icc_df <- data.frame(question = character(), icc = numeric())
for(i in d1_check_questions){
  temp_icc <- icc_fun(d1_check, var_name = i, 
                      var1 = "judgment", var2 = "response")
  temp_res <- data.frame(question = i, icc = temp_icc)
  s1_check_icc_df <- full_join(s1_check_icc_df, temp_res)
  rm(temp_res, i)
}
Joining, by = c("question", "icc")
Column `question` joining factors with different levels, coercing to character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vectorJoining, by = c("question", "icc")
Column `question` joining character vector and factor, coercing into character vector
s1_check_icc_df <- s1_check_icc_df %>%
  mutate(question = factor(question, levels = d1_check_questions),
         reliability = case_when(icc < 0.5 ~ "poor",
                                 icc < 0.75 ~ "moderate",
                                 icc < 0.9 ~ "good", 
                                 icc <= 1 ~ "excellent",
                                 TRUE ~ NA_character_),
         reliability = factor(reliability, 
                              levels = c("poor", "moderate", 
                                         "good", "excellent")),
         scale = case_when(question %in% s1_var_spirit ~ "spiritual experiences",
                           question %in% s1_var_other ~ "other experiences",
                           TRUE ~ NA_character_),
         scale = factor(scale, 
                        levels = c("spiritual experiences", "other experiences")))
s1_check_icc_df %>% arrange(icc)
s1_check_icc_df %>% 
  mutate(scale = recode_factor(scale,
                               "spiritual experiences" = "spiritual",
                               "other experiences" = "other")) %>%
  ggplot(aes(x = question, y = icc, color = reliability)) + 
  facet_grid(~ scale, scales = "free", space = "free") +
  geom_point() +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) +
  scale_color_brewer(palette = "RdYlGn", direction = 1, drop = F) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1,
                                   color = ifelse(s1_check_icc_df$reliability == "poor",
                                                  "#d7191c", "black"))) +
  labs(title = "Comparing initial responses vs. later 'judgments'",
       x = "Question", y = "Intraclass correlation coefficient (ICC)")

Percent with particular experiences

d1_byquestion %>% 
  count(godvoxaloud) %>% 
  mutate(godvoxaloud = recode_factor(godvoxaloud, 
                                     "0" = "no", "0.5" = "maybe", "1" = "yes"),
         proportion = round(n/sum(n), 2))
d1_byquestion %>% 
  filter(!is.na(godvoxaloud)) %>%
  count(country, godvoxaloud) %>% 
  mutate(godvoxaloud = recode_factor(godvoxaloud, 
                                     "0" = "no", "0.5" = "maybe", "1" = "yes")) %>%
  complete(country, nesting(godvoxaloud), fill = list(n = 0)) %>%
  spread(godvoxaloud, n) %>%
  mutate(total = no + maybe + yes) %>%
  janitor::adorn_totals() %>%
  mutate_at(vars(no, maybe, yes), funs(round(./total, 2)*100)) %>%
  select(-total) %>%
  data.frame() %>%
  mutate_at(vars(no, maybe, yes), funs(paste0(., "%"))) %>%
  kable() %>%
  kable_styling() %>%
  row_spec(6, bold = T)
Column `country` has different attributes on LHS and RHS of join
country no maybe yes
US 86% 1% 13%
Ghana 33% 0% 67%
Thailand 58% 2% 40%
China 50% 3% 47%
Vanuatu 54% 9% 37%
Total 57% 3% 41%
d1_byquestion %>% 
  filter(!is.na(godviavisions)) %>%
  count(country, godviavisions) %>% 
  mutate(godviavisions = recode_factor(godviavisions, 
                                       "0" = "no", "0.5" = "maybe", "1" = "yes")) %>%
  complete(country, nesting(godviavisions), fill = list(n = 0)) %>%
  spread(godviavisions, n) %>%
  mutate(total = no + maybe + yes) %>%
  janitor::adorn_totals() %>%
  mutate_at(vars(no, maybe, yes), funs(round(./total, 2)*100)) %>%
  select(-total) %>%
  data.frame() %>%
  mutate_at(vars(no, maybe, yes), funs(paste0(., "%"))) %>%
  kable() %>%
  kable_styling() %>%
  row_spec(6, bold = T)
Column `country` has different attributes on LHS and RHS of join
country no maybe yes
US 78% 0% 22%
Ghana 41% 0% 59%
Thailand 55% 2% 43%
China 78% 0% 22%
Vanuatu 61% 0% 39%
Total 63% 0% 37%

TML’s additional analyses

Focus on godvoxaloud and godviavisions

d1_tml1 <- d1 %>% select(country, subject_id, abs_score, por_score) %>%
  full_join(d1_byquestion %>% 
              select(country, subject_id, godvoxaloud, godviavisions) %>%
              gather(question, response, -c(country, subject_id)) %>%
              mutate(response_yn = case_when(response < 1 ~ 0,
                                             response == 1 ~ 1,
                                             TRUE ~ NA_real_)))
Joining, by = c("country", "subject_id")
glmer(response_yn ~ scale(por_score) + (1 | question) + (1 | country), 
      family = "binomial", d1_tml1) %>% summary()
boundary (singular) fit: see ?isSingular
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(por_score) + (1 | question) + (1 | country)
   Data: d1_tml1

     AIC      BIC   logLik deviance df.resid 
   769.4    787.2   -380.7    761.4      620 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7952 -0.7330 -0.4624  0.8706  2.4182 

Random effects:
 Groups   Name        Variance Std.Dev.
 country  (Intercept) 0.297    0.545   
 question (Intercept) 0.000    0.000   
Number of obs: 624, groups:  country, 5; question, 2

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)   
(Intercept)       -0.5236     0.2595  -2.018  0.04360 * 
scale(por_score)   0.3109     0.1090   2.851  0.00436 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
scl(pr_scr) -0.006
convergence code: 0
boundary (singular) fit: see ?isSingular
glmer(response_yn ~ scale(abs_score) + (1 | question) + (1 | country), 
      family = "binomial", d1_tml1) %>% summary()
boundary (singular) fit: see ?isSingular
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(abs_score) + (1 | question) + (1 | country)
   Data: d1_tml1

     AIC      BIC   logLik deviance df.resid 
   745.3    762.9   -368.6    737.3      603 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6946 -0.7569 -0.4474  0.9293  2.7417 

Random effects:
 Groups   Name        Variance Std.Dev.
 country  (Intercept) 0.4476   0.669   
 question (Intercept) 0.0000   0.000   
Number of obs: 607, groups:  country, 5; question, 2

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)      -0.53208    0.31285  -1.701 0.088989 .  
scale(abs_score)  0.33016    0.09554   3.456 0.000549 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
scl(bs_scr) -0.028
convergence code: 0
boundary (singular) fit: see ?isSingular
glmer(response_yn ~ scale(por_score) + (1 | country), 
      family = "binomial", d1_tml1 %>% filter(question == "godvoxaloud")) %>% 
  summary()
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(por_score) + (1 | country)
   Data: d1_tml1 %>% filter(question == "godvoxaloud")

     AIC      BIC   logLik deviance df.resid 
   385.8    397.0   -189.9    379.8      310 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7575 -0.7684 -0.4053  0.7893  2.5614 

Random effects:
 Groups  Name        Variance Std.Dev.
 country (Intercept) 0.585    0.7649  
Number of obs: 313, groups:  country, 5

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)
(Intercept)       -0.4694     0.3651  -1.286    0.199
scale(por_score)   0.2172     0.1551   1.401    0.161

Correlation of Fixed Effects:
            (Intr)
scl(pr_scr) 0.000 
glmer(response_yn ~ scale(abs_score) + (1 | country), 
      family = "binomial", d1_tml1 %>% filter(question == "godvoxaloud")) %>% 
  summary()
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(abs_score) + (1 | country)
   Data: d1_tml1 %>% filter(question == "godvoxaloud")

     AIC      BIC   logLik deviance df.resid 
   375.5    386.7   -184.8    369.5      302 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6176 -0.7766 -0.3915  0.8313  2.8594 

Random effects:
 Groups  Name        Variance Std.Dev.
 country (Intercept) 0.7087   0.8418  
Number of obs: 305, groups:  country, 5

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)
(Intercept)       -0.4886     0.3986  -1.226    0.220
scale(abs_score)   0.2052     0.1343   1.529    0.126

Correlation of Fixed Effects:
            (Intr)
scl(bs_scr) -0.019
glmer(response_yn ~ scale(por_score) + (1 | country), 
      family = "binomial", d1_tml1 %>% filter(question == "godviavisions")) %>% 
  summary()
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(por_score) + (1 | country)
   Data: d1_tml1 %>% filter(question == "godviavisions")

     AIC      BIC   logLik deviance df.resid 
   384.3    395.5   -189.1    378.3      308 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6899 -0.7062 -0.5004  0.9736  2.2955 

Random effects:
 Groups  Name        Variance Std.Dev.
 country (Intercept) 0.09818  0.3133  
Number of obs: 311, groups:  country, 5

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)   
(Intercept)       -0.6004     0.1891  -3.175  0.00150 **
scale(por_score)   0.5138     0.1657   3.100  0.00194 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
scl(pr_scr) -0.017
glmer(response_yn ~ scale(abs_score) + (1 | country), 
      family = "binomial", d1_tml1 %>% filter(question == "godviavisions")) %>% 
  summary()
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(abs_score) + (1 | country)
   Data: d1_tml1 %>% filter(question == "godviavisions")

     AIC      BIC   logLik deviance df.resid 
   371.7    382.9   -182.9    365.7      299 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6618 -0.7152 -0.4837  0.9376  2.9033 

Random effects:
 Groups  Name        Variance Std.Dev.
 country (Intercept) 0.3431   0.5857  
Number of obs: 302, groups:  country, 5

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)       -0.6102     0.2933  -2.081 0.037477 *  
scale(abs_score)   0.4761     0.1387   3.432 0.000599 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
scl(bs_scr) -0.066

Focus on other presence questions

d1_tml2 <- d1 %>% select(country, subject_id, abs_score, por_score) %>%
  full_join(d1_byquestion %>% 
              select(country, subject_id, neartangiblegod, presencenotgod, 
                     presencedemon, beingentbody, seehearnotgod, 
                     spiritbeingencounter) %>%
              gather(question, response, -c(country, subject_id)) %>%
              mutate(response_yn = case_when(response < 1 ~ 0,
                                             response == 1 ~ 1,
                                             TRUE ~ NA_real_)))
Joining, by = c("country", "subject_id")
glmer(response_yn ~ scale(por_score) + (1 | question) + (1 | country), 
      family = "binomial", d1_tml2) %>% summary()
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(por_score) + (1 | question) + (1 | country)
   Data: d1_tml2

     AIC      BIC   logLik deviance df.resid 
  2025.9   2048.1  -1009.0   2017.9     1875 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7229 -0.6165 -0.3640  0.7589  4.0868 

Random effects:
 Groups   Name        Variance Std.Dev.
 question (Intercept) 0.4731   0.6878  
 country  (Intercept) 0.6302   0.7939  
Number of obs: 1879, groups:  question, 6; country, 5

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)      -0.75940    0.45630  -1.664   0.0961 .  
scale(por_score)  0.44752    0.06785   6.596 4.22e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
scl(pr_scr) -0.012
glmer(response_yn ~ scale(abs_score) + (1 | question) + (1 | country), 
      family = "binomial", d1_tml2) %>% summary()
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: response_yn ~ scale(abs_score) + (1 | question) + (1 | country)
   Data: d1_tml2

     AIC      BIC   logLik deviance df.resid 
  1978.2   2000.3   -985.1   1970.2     1822 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6347 -0.6291 -0.3769  0.7575  4.4684 

Random effects:
 Groups   Name        Variance Std.Dev.
 question (Intercept) 0.4829   0.6949  
 country  (Intercept) 0.6679   0.8172  
Number of obs: 1826, groups:  question, 6; country, 5

Fixed effects:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)      -0.79078    0.46635  -1.696   0.0899 .  
scale(abs_score)  0.28715    0.05964   4.814 1.48e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
scl(bs_scr) -0.015

Cultural invitation vs. individual difference

Amount of variability each predictor, within each site

d1_variance <- d1 %>% 
  select(country, site, religion, subject_id, abs_score, por_score) %>%
  gather(var, score, ends_with("_score")) %>%
  filter(!is.na(score)) %>%
  mutate(score_rescaled = case_when(var == "abs_score" ~ score/1,
                                    var == "por_score" ~ score/3)) # called pv_score in study 4
bartlett.test(score_rescaled ~ var, 
              data = d1_variance %>% filter(country == "US"))

    Bartlett test of homogeneity of variances

data:  score_rescaled by var
Bartlett's K-squared = 2.3384, df = 1, p-value = 0.1262
d1_variance %>% 
  filter(country == "US") %>%
  group_by(var) %>%
  summarise(variance = var(score_rescaled))
bartlett.test(score_rescaled ~ var, 
              data = d1_variance %>% filter(country == "Ghana"))

    Bartlett test of homogeneity of variances

data:  score_rescaled by var
Bartlett's K-squared = 4.6186, df = 1, p-value = 0.03163
d1_variance %>% 
  filter(country == "Ghana") %>%
  group_by(var) %>%
  summarise(variance = var(score_rescaled))
bartlett.test(score_rescaled ~ var, 
              data = d1_variance %>% filter(country == "Thailand"))

    Bartlett test of homogeneity of variances

data:  score_rescaled by var
Bartlett's K-squared = 0.8459, df = 1, p-value = 0.3577
d1_variance %>% 
  filter(country == "Thailand") %>%
  group_by(var) %>%
  summarise(variance = var(score_rescaled))
bartlett.test(score_rescaled ~ var, 
              data = d1_variance %>% filter(country == "China"))

    Bartlett test of homogeneity of variances

data:  score_rescaled by var
Bartlett's K-squared = 9.3242, df = 1, p-value = 0.002262
d1_variance %>% 
  filter(country == "China") %>%
  group_by(var) %>%
  summarise(variance = var(score_rescaled))
bartlett.test(score_rescaled ~ var, 
              data = d1_variance %>% filter(country == "Vanuatu"))

    Bartlett test of homogeneity of variances

data:  score_rescaled by var
Bartlett's K-squared = 16.04, df = 1, p-value = 6.202e-05
d1_variance %>% 
  filter(country == "Vanuatu") %>%
  group_by(var) %>%
  summarise(variance = var(score_rescaled))
d1_variance %>% 
  group_by(var, country) %>%
  summarise(variance = var(score_rescaled)) %>%
  ungroup() %>%
  spread(var, variance) %>%
  rename(Country = country, Absorption = abs_score, 
         `Porosity Vignettes` = por_score) %>%
  kable(digits = 2) %>%
  kable_styling()
Country Absorption Porosity Vignettes
US 0.04 0.03
Ghana 0.05 0.03
Thailand 0.03 0.02
China 0.05 0.02
Vanuatu 0.03 0.01
d1_variance %>%
  group_by(var, country) %>%
  mutate(score_cent = scale(score_rescaled, scale = F)) %>%
  ungroup() %>%
  mutate(var = recode_factor(var,
                             "por_score" = "Porosity Vignettes",
                             "abs_score" = "Absorption")) %>%
  ggplot(aes(x = score_cent, fill = var, color = var, lty = var)) +
  facet_wrap(country ~ ., ncol = 3) +
  geom_density(alpha = 0.1) +
  scale_linetype_manual(values = c(1, 2)) +
  scale_color_brewer(palette = "Set1", direction = -1) +
  scale_fill_brewer(palette = "Set1", direction = -1) +
  labs(x = "Score (rescaled to run from 0-1, centered at the mean by country)",
       color = "Scale", fill = "Scale", lty = "Scale") +
  theme(legend.position = "bottom")

d1_variance %>%
  group_by(var, country, site, religion) %>%
  mutate(score_cent = scale(score_rescaled, scale = F)) %>%
  ungroup() %>%
  mutate(var = recode_factor(var,
                             "por_score" = "Porosity Vignettes",
                             "abs_score" = "Absorption")) %>%
  ggplot(aes(x = score_cent, fill = var, color = var, lty = var)) +
  facet_grid(cols = vars(country), rows = vars(site, religion)) +
  geom_density(alpha = 0.1) +
  scale_linetype_manual(values = c(1, 2)) +
  scale_color_brewer(palette = "Set1", direction = -1) +
  scale_fill_brewer(palette = "Set1", direction = -1) +
  labs(x = "Score (rescaled to run from 0-1, centered at the mean by country)",
       color = "Scale", fill = "Scale", lty = "Scale") +
  theme(legend.position = "bottom")

Variance accounted for by country

r7 <- lm(por_score_std ~ country, d1)
regtab_fun(r7, country_var1 = "country_gh", country_var2 = "country_th", country_var3 = "country_ch", country_var4 = "country_vt")
rsquared(r7)
r9 <- lm(abs_score_std ~ country, d1)
rsquared(r9)
LS0tCnRpdGxlOiAiU3R1ZHkgMTogRXh0cmEgKG5vdCByZXBvcnRlZCkiCnN1YnRpdGxlOiAiTHVocm1hbm4sIFdlaXNtYW4sIGV0IGFsLiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSBjb25kdWN0IGFkZGl0aW9uYWwgYW5hbHlzZXMgZm9yIFN0dWR5IDE6IEluLWRlcHRoIGludGVydmlld3Mgd2l0aCBwZW9wbGUgb2YgZmFpdGggKG5vdCByZXBvcnRlZCBpbiB0aGUgbWFpbiB0ZXh0IG9yIHRoZSBTdXBwbGVtZW50YWwgSW5mb3JtYXRpb24gb2YgdGhlIHBhcGVyKS4KCmBgYHtyfQpzb3VyY2UoIi4uLy4uL3NjcmlwdHNfZ2VuZXJhbC9kZXBlbmRlbmNpZXMuUiIpCnNvdXJjZSgiLi4vLi4vc2NyaXB0c19nZW5lcmFsL2N1c3RvbV9mdW5zLlIiKQpzb3VyY2UoIi4uLy4uL3NjcmlwdHNfZ2VuZXJhbC92YXJfcmVjb2RlX2NvbnRyYXN0LlIiKQpzb3VyY2UoIi4uL3NjcmlwdHNfczEvczFfdmFyX2dyb3Vwcy5SIikKc291cmNlKCIuLi8uLi9zY3JpcHRzX2dlbmVyYWwvZGF0YV9sb2FkLlIiKQpgYGAKCgojIE1vcmUgb24gcmVjb2RpbmcgKCJRVFMyIikKCmBgYHtyfQpkMXJfYnlxdWVzdGlvbiA8LSByZWFkX2NzdigiLi4vZGF0YS9zdHVkeTFyX2J5cXVlc3Rpb24uY3N2IikKYGBgCgpgYGB7cn0KZDFyIDwtIHJlYWRfY3N2KCIuLi9kYXRhL3N0dWR5MXIuY3N2IikgJT4lCiAgcmVuYW1lX2F0KHZhcnMoY29udGFpbnMoInNjb3JlIikpLCBmdW5zKGdzdWIoInNjb3JlIiwgInJlY29kZWQiLCAuKSkpICU+JQogIGZ1bGxfam9pbihkMSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICBzaXRlID0gZmFjdG9yKHNpdGUsIGxldmVscyA9IGxldmVsc19zaXRlKSwKICAgICAgICAgcmVsaWdpb24gPSBmYWN0b3IocmVsaWdpb24sIGxldmVscyA9IGxldmVsc19yZWxpZ2lvbiksCiAgICAgICAgIHJlc2VhcmNoZXIgPSBmYWN0b3IocmVzZWFyY2hlciwgbGV2ZWxzID0gbGV2ZWxzX3Jlc2VhcmNoZXIpKQoKY29udHJhc3RzKGQxciRjb3VudHJ5KSA8LSBjb250cmFzdHNfY291bnRyeQpjb250cmFzdHMoZDFyJHNpdGUpIDwtIGNvbnRyYXN0c19zaXRlCmNvbnRyYXN0cyhkMXIkcmVsaWdpb24pIDwtIGNvbnRyYXN0c19yZWxpZ2lvbgpgYGAKCiMjIEF2ZXJhZ2VzLCBieSBzY29yZQoKYGBge3J9CmQxciAlPiUgCiAgc2VsZWN0KGNvdW50cnksIHN1YmplY3RfaWQsIGVuZHNfd2l0aCgicmVjb2RlZCIpLCBlbmRzX3dpdGgoInNjb3JlIikpICU+JQogIGdhdGhlcihzY2FsZSwgc2NvcmUsIC1jKGNvdW50cnksIHN1YmplY3RfaWQpKSAlPiUKICBmaWx0ZXIoZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB8IGdyZXBsKCJvdGhlciIsIHNjYWxlKSkgJT4lCiAgbXV0YXRlKHNjb3JlX3R5cGUgPSBjYXNlX3doZW4oZ3JlcGwoInJlY29kZWQiLCBzY2FsZSkgfiAicmVjb2RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoInNjb3JlIiwgc2NhbGUpIH4gIm9yaWdpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHNjb3JlX3R5cGUgPSBmYWN0b3Ioc2NvcmVfdHlwZSwgbGV2ZWxzID0gYygib3JpZ2luYWwiLCAicmVjb2RlZCIpKSwKICAgICAgICAgc2NhbGUgPSBjYXNlX3doZW4oZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB+ICJzcGlyaXR1YWwgZXhwZXJpZW5jZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgib3RoZXIiLCBzY2FsZSkgfiAib3RoZXIgZXh0cmFvcmRpbmFyeSBleHBlcmllbmNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgc2NhbGUgPSBmYWN0b3Ioc2NhbGUsIGxldmVscyA9IGMoInNwaXJpdHVhbCBleHBlcmllbmNlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3RoZXIgZXh0cmFvcmRpbmFyeSBleHBlcmllbmNlcyIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2NhbGUsIHkgPSBzY29yZSwgZ3JvdXAgPSBzY29yZV90eXBlKSkgKwogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBzY29yZV90eXBlKSwgYWxwaGEgPSAwLjIsCiAgIyAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLndpZHRoID0gMC4xLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC41LAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLjA0KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShzY2FsZSwgc2NvcmVfdHlwZSkgJT4lCiAgICAgICAgICAgICAgICAgICAgbGFuZ2NvZzo6bXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyLCBmaWxsID0gc2NvcmVfdHlwZSksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBmYXR0ZW4gPSA2KSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpbmcgcmVjb2RlZCBzY29yZXMgKFFUUzIpIHRvIG9yaWdpbmFsIHNjb3JlcyAoUVRTMSkiLAogICAgICAgeCA9ICJTY2FsZSIsIHkgPSAiU2NvcmUgKHJhbmdlOiAwLTEpIiwKICAgICAgIGZpbGwgPSAiU2NvcmUgdHlwZSIpCmBgYAoKYGBge3J9CmxtZXIoc2NvcmUgfiBzY29yZV90eXBlICogc2NhbGUgKyAoMSB8IHN1YmplY3RfaWQpLCAKICAgZGF0YSA9IGQxciAlPiUgCiAgICAgc2VsZWN0KGNvdW50cnksIHN1YmplY3RfaWQsIGVuZHNfd2l0aCgicmVjb2RlZCIpLCBlbmRzX3dpdGgoInNjb3JlIikpICU+JQogICAgIGdhdGhlcihzY2FsZSwgc2NvcmUsIC1jKGNvdW50cnksIHN1YmplY3RfaWQpKSAlPiUKICAgICBmaWx0ZXIoZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB8IGdyZXBsKCJvdGhlciIsIHNjYWxlKSkgJT4lCiAgICAgbXV0YXRlKHNjb3JlX3R5cGUgPSBjYXNlX3doZW4oZ3JlcGwoInJlY29kZWQiLCBzY2FsZSkgfiAicmVjb2RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoInNjb3JlIiwgc2NhbGUpIH4gIm9yaWdpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgICAgIHNjb3JlX3R5cGUgPSBmYWN0b3Ioc2NvcmVfdHlwZSwgbGV2ZWxzID0gYygib3JpZ2luYWwiLCAicmVjb2RlZCIpKSwKICAgICAgICAgICAgc2NhbGUgPSBjYXNlX3doZW4oZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB+ICJzcGlyaXR1YWwgZXhwZXJpZW5jZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgib3RoZXIiLCBzY2FsZSkgfiAib3RoZXIgZXh0cmFvcmRpbmFyeSBleHBlcmllbmNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgICAgc2NhbGUgPSBmYWN0b3Ioc2NhbGUsIGxldmVscyA9IGMoInNwaXJpdHVhbCBleHBlcmllbmNlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3RoZXIgZXh0cmFvcmRpbmFyeSBleHBlcmllbmNlcyIpKSksCiAgIGNvbnRyYXN0cyA9IGxpc3Qoc2NvcmVfdHlwZSA9ICJjb250ci5zdW0iLCBzY2FsZSA9ICJjb250ci5zdW0iKSkgJT4lCiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmQxciAlPiUgCiAgc2VsZWN0KGNvdW50cnksIHN1YmplY3RfaWQsIGVuZHNfd2l0aCgicmVjb2RlZCIpLCBlbmRzX3dpdGgoInNjb3JlIikpICU+JQogIGdhdGhlcihzY2FsZSwgc2NvcmUsIC1jKGNvdW50cnksIHN1YmplY3RfaWQpKSAlPiUKICBmaWx0ZXIoZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB8IGdyZXBsKCJvdGhlciIsIHNjYWxlKSkgJT4lCiAgbXV0YXRlKHNjb3JlX3R5cGUgPSBjYXNlX3doZW4oZ3JlcGwoInJlY29kZWQiLCBzY2FsZSkgfiAicmVjb2RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoInNjb3JlIiwgc2NhbGUpIH4gIm9yaWdpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHNjb3JlX3R5cGUgPSBmYWN0b3Ioc2NvcmVfdHlwZSwgbGV2ZWxzID0gYygib3JpZ2luYWwiLCAicmVjb2RlZCIpKSwKICAgICAgICAgc2NhbGUgPSBjYXNlX3doZW4oZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB+ICJzcGlyaXR1YWwgZXhwLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJvdGhlciIsIHNjYWxlKSB+ICJvdGhlciBleHAuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICBzY2FsZSA9IGZhY3RvcihzY2FsZSwgbGV2ZWxzID0gYygic3Bpcml0dWFsIGV4cC4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGV4cC4iKSkpICU+JQogIGdncGxvdChhZXMoeCA9IHNjYWxlLCB5ID0gc2NvcmUsIGdyb3VwID0gc2NvcmVfdHlwZSkpICsKICBmYWNldF9ncmlkKH4gY291bnRyeSkgKwogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBzY29yZV90eXBlKSwgYWxwaGEgPSAwLjIsCiAgIyAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLndpZHRoID0gMC4xLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC41LAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLjA0KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShzY2FsZSwgc2NvcmVfdHlwZSwgY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgbGFuZ2NvZzo6bXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyLCBmaWxsID0gc2NvcmVfdHlwZSksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBmYXR0ZW4gPSA2KSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpbmcgcmVjb2RlZCBzY29yZXMgKFFUUzIpIHRvIG9yaWdpbmFsIHNjb3JlcyAoUVRTMSkiLAogICAgICAgeCA9ICJTY2FsZSIsIHkgPSAiU2NvcmUgKHJhbmdlOiAwLTEpIiwKICAgICAgIGZpbGwgPSAiU2NvcmUgdHlwZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CmQxciAlPiUgCiAgc2VsZWN0KGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkLCAKICAgICAgICAgZW5kc193aXRoKCJyZWNvZGVkIiksIGVuZHNfd2l0aCgic2NvcmUiKSkgJT4lCiAgZ2F0aGVyKHNjYWxlLCBzY29yZSwgLWMoY291bnRyeSwgc2l0ZSwgcmVsaWdpb24sIHN1YmplY3RfaWQpKSAlPiUKICBmaWx0ZXIoZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB8IGdyZXBsKCJvdGhlciIsIHNjYWxlKSkgJT4lCiAgbXV0YXRlKHNjb3JlX3R5cGUgPSBjYXNlX3doZW4oZ3JlcGwoInJlY29kZWQiLCBzY2FsZSkgfiAicmVjb2RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoInNjb3JlIiwgc2NhbGUpIH4gIm9yaWdpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHNjb3JlX3R5cGUgPSBmYWN0b3Ioc2NvcmVfdHlwZSwgbGV2ZWxzID0gYygib3JpZ2luYWwiLCAicmVjb2RlZCIpKSwKICAgICAgICAgc2NhbGUgPSBjYXNlX3doZW4oZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB+ICJzcGlyaXR1YWwgZXhwLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJvdGhlciIsIHNjYWxlKSB+ICJvdGhlciBleHAuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICBzY2FsZSA9IGZhY3RvcihzY2FsZSwgbGV2ZWxzID0gYygic3Bpcml0dWFsIGV4cC4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGV4cC4iKSkpICU+JQogIGdncGxvdChhZXMoeCA9IHNjYWxlLCB5ID0gc2NvcmUsIGdyb3VwID0gc2NvcmVfdHlwZSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHNpdGUsIHJlbGlnaW9uKSwgY29scyA9IHZhcnMoY291bnRyeSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHNjb3JlX3R5cGUpLCBhbHBoYSA9IDAuMiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLndpZHRoID0gMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLmhlaWdodCA9IDAuMDQpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHNjYWxlLCBzY29yZV90eXBlLCBjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbikgJT4lCiAgICAgICAgICAgICAgICAgICAgbGFuZ2NvZzo6bXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyLCBmaWxsID0gc2NvcmVfdHlwZSksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBmYXR0ZW4gPSA2KSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpbmcgcmVjb2RlZCBzY29yZXMgKFFUUzIpIHRvIG9yaWdpbmFsIHNjb3JlcyAoUVRTMSkiLAogICAgICAgeCA9ICJTY2FsZSIsIHkgPSAiU2NvcmUgKHJhbmdlOiAwLTEpIiwKICAgICAgIGZpbGwgPSAiU2NvcmUgdHlwZSIsIGNvbG9yID0gIlNjb3JlIHR5cGUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCmBgYHtyfQpkMXIgJT4lIAogIHNlbGVjdChjb3VudHJ5LCBzdWJqZWN0X2lkLCBjb2RlciwgZW5kc193aXRoKCJyZWNvZGVkIikpICU+JQogIGdhdGhlcihzY2FsZSwgc2NvcmUsIC1jKGNvdW50cnksIHN1YmplY3RfaWQsIGNvZGVyKSkgJT4lCiAgbXV0YXRlKHNjb3JlX3R5cGUgPSBjYXNlX3doZW4oZ3JlcGwoInJlY29kZWQiLCBzY2FsZSkgfiAicmVjb2RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoInNjb3JlIiwgc2NhbGUpIH4gIm9yaWdpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHNjb3JlX3R5cGUgPSBmYWN0b3Ioc2NvcmVfdHlwZSwgbGV2ZWxzID0gYygib3JpZ2luYWwiLCAicmVjb2RlZCIpKSwKICAgICAgICAgc2NhbGUgPSBjYXNlX3doZW4oZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB+ICJzcGlyaXR1YWwgZXhwLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJvdGhlciIsIHNjYWxlKSB+ICJvdGhlciBleHAuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICBzY2FsZSA9IGZhY3RvcihzY2FsZSwgbGV2ZWxzID0gYygic3Bpcml0dWFsIGV4cC4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGV4cC4iKSkpICU+JQogIGZpbHRlcihncmVwbCgic3Bpcml0Iiwgc2NhbGUpIHwgZ3JlcGwoIm90aGVyIiwgc2NhbGUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzY2FsZSwgeSA9IHNjb3JlLCBncm91cCA9IGNvZGVyKSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb2RlciksIGFscGhhID0gMC4yLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMC4wNCkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoc2NhbGUsIGNvZGVyLCBjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBsYW5nY29nOjptdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIsIGZpbGwgPSBjb2RlciksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjEsIGZhdHRlbiA9IDUsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpbmcgY29kZXJzIGluIHJlY29kZWQgZGF0YXNldCAoUVRTMikiLAogICAgICAgeCA9ICJTY2FsZSIsIHkgPSAiU2NvcmUgKHJhbmdlOiAwLTEpIiwgZmlsbCA9ICJDb2RlciIsIGNvbG9yID0gIkNvZGVyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgpgYGB7cn0KbG1lcihzY29yZSB+IHNjYWxlICogY29kZXIgKyAoMSB8IHN1YmplY3RfaWQpLCAKICAgZGF0YSA9IGQxciAlPiUgCiAgICAgc2VsZWN0KGNvdW50cnksIGNvZGVyLCBzdWJqZWN0X2lkLCBlbmRzX3dpdGgoInJlY29kZWQiKSkgJT4lCiAgICAgZGlzdGluY3QoKSAlPiUKICAgICBnYXRoZXIoc2NhbGUsIHNjb3JlLCAtYyhjb3VudHJ5LCBzdWJqZWN0X2lkLCBjb2RlcikpICU+JQogICAgIGZpbHRlcihncmVwbCgic3Bpcml0Iiwgc2NhbGUpIHwgZ3JlcGwoIm90aGVyIiwgc2NhbGUpKSAlPiUKICAgICBtdXRhdGUoc2NhbGUgPSBjYXNlX3doZW4oZ3JlcGwoInNwaXJpdCIsIHNjYWxlKSB+ICJzcGlyaXR1YWwgZXhwZXJpZW5jZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgib3RoZXIiLCBzY2FsZSkgfiAib3RoZXIgZXh0cmFvcmRpbmFyeSBleHBlcmllbmNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgICAgc2NhbGUgPSBmYWN0b3Ioc2NhbGUsIGxldmVscyA9IGMoInNwaXJpdHVhbCBleHBlcmllbmNlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3RoZXIgZXh0cmFvcmRpbmFyeSBleHBlcmllbmNlcyIpKSwKICAgICAgICAgICAgY29kZXIgPSBmYWN0b3IoY29kZXIsIGxldmVscyA9IGMoIk5pa2tpIiwgIk1hcmlhIiwgIkx1Y3kiKSkpLAogICBjb250cmFzdHMgPSBsaXN0KHNjYWxlID0gImNvbnRyLnN1bSIsIAogICAgICAgICAgICAgICAgICAgIGNvZGVyID0gY2JpbmQoIl9OdkdNIiA9IGMoMSwgMCwgLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9NdkdNIiA9IGMoMCwgMSwgLTEpKSkpICU+JQogIHN1bW1hcnkoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpkMXIgJT4lIAogIHNlbGVjdChjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbiwgc3ViamVjdF9pZCwgY29kZXIsIGVuZHNfd2l0aCgicmVjb2RlZCIpKSAlPiUKICBnYXRoZXIoc2NhbGUsIHNjb3JlLCAtYyhjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbiwgc3ViamVjdF9pZCwgY29kZXIpKSAlPiUKICBtdXRhdGUoc2NvcmVfdHlwZSA9IGNhc2Vfd2hlbihncmVwbCgicmVjb2RlZCIsIHNjYWxlKSB+ICJyZWNvZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgic2NvcmUiLCBzY2FsZSkgfiAib3JpZ2luYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgc2NvcmVfdHlwZSA9IGZhY3RvcihzY29yZV90eXBlLCBsZXZlbHMgPSBjKCJvcmlnaW5hbCIsICJyZWNvZGVkIikpLAogICAgICAgICBzY2FsZSA9IGNhc2Vfd2hlbihncmVwbCgic3Bpcml0Iiwgc2NhbGUpIH4gInNwaXJpdHVhbCBleHAuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIm90aGVyIiwgc2NhbGUpIH4gIm90aGVyIGV4cC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHNjYWxlID0gZmFjdG9yKHNjYWxlLCBsZXZlbHMgPSBjKCJzcGlyaXR1YWwgZXhwLiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3RoZXIgZXhwLiIpKSkgJT4lCiAgZmlsdGVyKGdyZXBsKCJzcGlyaXQiLCBzY2FsZSkgfCBncmVwbCgib3RoZXIiLCBzY2FsZSkpICU+JQogIGdncGxvdChhZXMoeCA9IHNjYWxlLCB5ID0gc2NvcmUsIGdyb3VwID0gY29kZXIpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhzaXRlLCByZWxpZ2lvbiksIGNvbHMgPSB2YXJzKGNvdW50cnkpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb2RlciksIGFscGhhID0gMC4yLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMC4wNCkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoc2NhbGUsIGNvZGVyLCBjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbikgJT4lCiAgICAgICAgICAgICAgICAgICAgbGFuZ2NvZzo6bXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyLCBmaWxsID0gY29kZXIpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBmYXR0ZW4gPSA1LAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIGdlb21fdGV4dChkYXRhID0gLiAlPiUgY291bnQoY291bnRyeSwgc2l0ZSwgcmVsaWdpb24sIGNvZGVyLCBzY2FsZSksCiAgICAgICAgICAgICBhZXMoeSA9IDAsIGxhYmVsID0gcGFzdGUwKCJuPSIsIG4pLCBjb2xvciA9IGNvZGVyKSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKwogIGxhYnModGl0bGUgPSAiQ29tcGFyaW5nIGNvZGVycyBpbiByZWNvZGVkIGRhdGFzZXQgKFFUUzIpIiwKICAgICAgIHggPSAiU2NhbGUiLCB5ID0gIlNjb3JlIChyYW5nZTogMC0xKSIsIGZpbGwgPSAiQ29kZXIiLCBjb2xvciA9ICJDb2RlciIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKCgojIyBBdmVyYWdlcywgYnkgcXVlc3Rpb24KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpkMXJfYnlxdWVzdGlvbiAlPiUgCiAgc2VsZWN0KGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkLCAKICAgICAgICAgISFzMV92YXJfc3Bpcml0LCAhIXMxX3Zhcl9vdGhlcikgJT4lCiAgZ2F0aGVyKHF1ZXN0aW9uLCByZWNvZGVkLCAtYyhjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbiwgc3ViamVjdF9pZCkpICU+JQogIGZ1bGxfam9pbihkMV9ieXF1ZXN0aW9uICU+JQogICAgICAgICAgICAgIHNlbGVjdChjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbiwgc3ViamVjdF9pZCwgCiAgICAgICAgICAgICAgICAgICAgICEhczFfdmFyX3NwaXJpdCwgISFzMV92YXJfb3RoZXIpICU+JQogICAgICAgICAgICAgIGdhdGhlcihxdWVzdGlvbiwgb3JpZ2luYWwsIC1jKGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkKSkpICU+JQogIGdhdGhlcihyZXNwb25zZV90eXBlLCByZXNwb25zZSwgYyhvcmlnaW5hbCwgcmVjb2RlZCkpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGZhY3RvcihxdWVzdGlvbiwgbGV2ZWxzID0gYyhzMV92YXJfc3Bpcml0LCBzMV92YXJfb3RoZXIpKSwKICAgICAgICAgcmVzcG9uc2VfdHlwZSA9IGZhY3RvcihyZXNwb25zZV90eXBlLCBsZXZlbHMgPSBjKCJvcmlnaW5hbCIsICJyZWNvZGVkIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBxdWVzdGlvbiwgeSA9IHJlc3BvbnNlLCBncm91cCA9IHJlc3BvbnNlX3R5cGUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHF1ZXN0aW9uLCByZXNwb25zZV90eXBlKSAlPiUKICAgICAgICAgICAgICAgICAgICBsYW5nY29nOjptdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJyZXNwb25zZSIsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIsCiAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gcmVzcG9uc2VfdHlwZSksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBmYXR0ZW4gPSA2KSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpbmcgcmVjb2RlZCBzY29yZXMgKFFUUzIpIHRvIG9yaWdpbmFsIHNjb3JlcyAoUVRTMSkiLAogICAgICAgeCA9ICJRdWVzdGlvbiIsIHkgPSAiUmVzcG9uc2UgKHJhbmdlOiAwLTEpIiwKICAgICAgIGZpbGwgPSAiUmVzcG9uc2UgdHlwZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKYGBge3J9CmQxcl9ieXF1ZXN0aW9uICU+JSAKICBzZWxlY3QoY291bnRyeSwgc2l0ZSwgcmVsaWdpb24sIHN1YmplY3RfaWQsIAogICAgICAgICAhIXMxX3Zhcl9zcGlyaXQsICEhczFfdmFyX290aGVyKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlY29kZWQsIC1jKGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkKSkgJT4lCiAgZnVsbF9qb2luKGQxX2J5cXVlc3Rpb24gJT4lCiAgICAgICAgICAgICAgc2VsZWN0KGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkLCAKICAgICAgICAgICAgICAgICAgICAgISFzMV92YXJfc3Bpcml0LCAhIXMxX3Zhcl9vdGhlcikgJT4lCiAgICAgICAgICAgICAgZ2F0aGVyKHF1ZXN0aW9uLCBvcmlnaW5hbCwgLWMoY291bnRyeSwgc2l0ZSwgcmVsaWdpb24sIHN1YmplY3RfaWQpKSkgJT4lCiAgZ2F0aGVyKHJlc3BvbnNlX3R5cGUsIHJlc3BvbnNlLCBjKG9yaWdpbmFsLCByZWNvZGVkKSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZmFjdG9yKHF1ZXN0aW9uLCBsZXZlbHMgPSBjKHMxX3Zhcl9zcGlyaXQsIHMxX3Zhcl9vdGhlcikpLAogICAgICAgICByZXNwb25zZV90eXBlID0gZmFjdG9yKHJlc3BvbnNlX3R5cGUsIGxldmVscyA9IGMoIm9yaWdpbmFsIiwgInJlY29kZWQiKSkpICU+JQogIGZpbHRlcihxdWVzdGlvbiA9PSAic2VlaGVhcm5vdGdvZCIpICU+JQogIGNvdW50KHJlc3BvbnNlX3R5cGUsIHJlc3BvbnNlKSAlPiUKICBzcHJlYWQocmVzcG9uc2UsIG4pCmBgYAoKYGBge3J9CmQxcl9ieXF1ZXN0aW9uICU+JSAKICBzZWxlY3QoY291bnRyeSwgc2l0ZSwgcmVsaWdpb24sIHN1YmplY3RfaWQsIAogICAgICAgICAhIXMxX3Zhcl9zcGlyaXQsICEhczFfdmFyX290aGVyKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlY29kZWQsIC1jKGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkKSkgJT4lCiAgZnVsbF9qb2luKGQxX2J5cXVlc3Rpb24gJT4lCiAgICAgICAgICAgICAgc2VsZWN0KGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkLCAKICAgICAgICAgICAgICAgICAgICAgISFzMV92YXJfc3Bpcml0LCAhIXMxX3Zhcl9vdGhlcikgJT4lCiAgICAgICAgICAgICAgZ2F0aGVyKHF1ZXN0aW9uLCBvcmlnaW5hbCwgLWMoY291bnRyeSwgc2l0ZSwgcmVsaWdpb24sIHN1YmplY3RfaWQpKSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZmFjdG9yKHF1ZXN0aW9uLCBsZXZlbHMgPSBjKHMxX3Zhcl9zcGlyaXQsIHMxX3Zhcl9vdGhlcikpKSAlPiUKICBmaWx0ZXIocXVlc3Rpb24gPT0gInNlZWhlYXJub3Rnb2QiKSAlPiUKICBtdXRhdGUobWF0Y2ggPSAob3JpZ2luYWwgPT0gcmVjb2RlZCkpICU+JQogIGNvdW50KG1hdGNoKSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKQpgYGAKCgoKCiMgQ29tcGFyaW5nIGZpcnN0IHF1ZXN0aW9uIHRvIGludGVydmlld2VyIGp1ZGdtZW50cyB3aGVuIGF2YWlsYWJsZQoKYGBge3J9CmQxX2NoZWNrX3F1ZXN0aW9ucyA8LSBjKCJnb2R2b3hhbG91ZCIsICJnb2R2aWF2aXNpb25zIiwgImdvZHZpYXRvdWNoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJnb2R2aWFzbWVsbCIsICJuZWFydGFuZ2libGVnb2QiLCAicHJlc2VuY2Vub3Rnb2QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgInByZXNlbmNlZGVtb24iLCAiYmVpbmdlbnRib2R5IiwgInNlZWhlYXJub3Rnb2QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIndoaXRlbGlnaHQiLCAic3Bpcml0YmVpbmdlbmNvdW50ZXIiLCAidm94d2hlbmFsb25lIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJzZWV0aGluZ3Njb3JuZXJleWUiKQpgYGAKCmBgYHtyfQpkMV9jaGVjayA8LSBkMV9ieXF1ZXN0aW9uICU+JSAKICBzZWxlY3QoY291bnRyeSwgc3ViamVjdF9pZCwgZW5kc193aXRoKCJfanVkZ2UiKSkgJT4lCiAgZ2F0aGVyKHF1ZXN0aW9uLCBqdWRnbWVudCwgLWMoY291bnRyeSwgc3ViamVjdF9pZCkpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIl9qdWRnZSIsICIiLCBxdWVzdGlvbikpICU+JQogIGZ1bGxfam9pbihkMV9ieXF1ZXN0aW9uICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY291bnRyeSwgc3ViamVjdF9pZCwgISFkMV9jaGVja19xdWVzdGlvbnMpICU+JQogICAgICAgICAgICAgIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIC1jKGNvdW50cnksIHN1YmplY3RfaWQpKSkKCmBgYAoKYGBge3J9CmQxX2NoZWNrICU+JQogIGZpbHRlcihxdWVzdGlvbiAlaW4lIGQxX2NoZWNrX3F1ZXN0aW9ucykgJT4lCiAgbXV0YXRlKGFncmVlID0gKGp1ZGdtZW50ID09IHJlc3BvbnNlKSwKICAgICAgICAgYWdyZWUgPSBpZmVsc2UoaXMubmEoYWdyZWUpLCAwLCBhZ3JlZSkpICU+JQogIGdyb3VwX2J5KHF1ZXN0aW9uKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudF9hZ3JlZSA9IG1lYW4oYWdyZWUsIG5hLnJtID0gVCkpICU+JQogIGFycmFuZ2UocGVyY2VudF9hZ3JlZSkKYGBgCgpgYGB7cn0KczFfY2hlY2tfaWNjX2RmIDwtIGRhdGEuZnJhbWUocXVlc3Rpb24gPSBjaGFyYWN0ZXIoKSwgaWNjID0gbnVtZXJpYygpKQpmb3IoaSBpbiBkMV9jaGVja19xdWVzdGlvbnMpewogIHRlbXBfaWNjIDwtIGljY19mdW4oZDFfY2hlY2ssIHZhcl9uYW1lID0gaSwgCiAgICAgICAgICAgICAgICAgICAgICB2YXIxID0gImp1ZGdtZW50IiwgdmFyMiA9ICJyZXNwb25zZSIpCiAgdGVtcF9yZXMgPC0gZGF0YS5mcmFtZShxdWVzdGlvbiA9IGksIGljYyA9IHRlbXBfaWNjKQogIHMxX2NoZWNrX2ljY19kZiA8LSBmdWxsX2pvaW4oczFfY2hlY2tfaWNjX2RmLCB0ZW1wX3JlcykKICBybSh0ZW1wX3JlcywgaSkKfQoKczFfY2hlY2tfaWNjX2RmIDwtIHMxX2NoZWNrX2ljY19kZiAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBmYWN0b3IocXVlc3Rpb24sIGxldmVscyA9IGQxX2NoZWNrX3F1ZXN0aW9ucyksCiAgICAgICAgIHJlbGlhYmlsaXR5ID0gY2FzZV93aGVuKGljYyA8IDAuNSB+ICJwb29yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjIDwgMC43NSB+ICJtb2RlcmF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljYyA8IDAuOSB+ICJnb29kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljYyA8PSAxIH4gImV4Y2VsbGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgcmVsaWFiaWxpdHkgPSBmYWN0b3IocmVsaWFiaWxpdHksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwb29yIiwgIm1vZGVyYXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvb2QiLCAiZXhjZWxsZW50IikpLAogICAgICAgICBzY2FsZSA9IGNhc2Vfd2hlbihxdWVzdGlvbiAlaW4lIHMxX3Zhcl9zcGlyaXQgfiAic3Bpcml0dWFsIGV4cGVyaWVuY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gJWluJSBzMV92YXJfb3RoZXIgfiAib3RoZXIgZXhwZXJpZW5jZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHNjYWxlID0gZmFjdG9yKHNjYWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic3Bpcml0dWFsIGV4cGVyaWVuY2VzIiwgIm90aGVyIGV4cGVyaWVuY2VzIikpKQpgYGAKCmBgYHtyfQpzMV9jaGVja19pY2NfZGYgJT4lIGFycmFuZ2UoaWNjKQpzMV9jaGVja19pY2NfZGYgJT4lIAogIG11dGF0ZShzY2FsZSA9IHJlY29kZV9mYWN0b3Ioc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Bpcml0dWFsIGV4cGVyaWVuY2VzIiA9ICJzcGlyaXR1YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGV4cGVyaWVuY2VzIiA9ICJvdGhlciIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBxdWVzdGlvbiwgeSA9IGljYywgY29sb3IgPSByZWxpYWJpbGl0eSkpICsgCiAgZmFjZXRfZ3JpZCh+IHNjYWxlLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMikpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJSZFlsR24iLCBkaXJlY3Rpb24gPSAxLCBkcm9wID0gRikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaWZlbHNlKHMxX2NoZWNrX2ljY19kZiRyZWxpYWJpbGl0eSA9PSAicG9vciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNkNzE5MWMiLCAiYmxhY2siKSkpICsKICBsYWJzKHRpdGxlID0gIkNvbXBhcmluZyBpbml0aWFsIHJlc3BvbnNlcyB2cy4gbGF0ZXIgJ2p1ZGdtZW50cyciLAogICAgICAgeCA9ICJRdWVzdGlvbiIsIHkgPSAiSW50cmFjbGFzcyBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAoSUNDKSIpCmBgYAoKCiMgUGVyY2VudCB3aXRoIHBhcnRpY3VsYXIgZXhwZXJpZW5jZXMKCmBgYHtyfQpkMV9ieXF1ZXN0aW9uICU+JSAKICBjb3VudChnb2R2b3hhbG91ZCkgJT4lIAogIG11dGF0ZShnb2R2b3hhbG91ZCA9IHJlY29kZV9mYWN0b3IoZ29kdm94YWxvdWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiID0gIm5vIiwgIjAuNSIgPSAibWF5YmUiLCAiMSIgPSAieWVzIiksCiAgICAgICAgIHByb3BvcnRpb24gPSByb3VuZChuL3N1bShuKSwgMikpCmBgYAoKYGBge3J9CmQxX2J5cXVlc3Rpb24gJT4lIAogIGZpbHRlcighaXMubmEoZ29kdm94YWxvdWQpKSAlPiUKICBjb3VudChjb3VudHJ5LCBnb2R2b3hhbG91ZCkgJT4lIAogIG11dGF0ZShnb2R2b3hhbG91ZCA9IHJlY29kZV9mYWN0b3IoZ29kdm94YWxvdWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiID0gIm5vIiwgIjAuNSIgPSAibWF5YmUiLCAiMSIgPSAieWVzIikpICU+JQogIGNvbXBsZXRlKGNvdW50cnksIG5lc3RpbmcoZ29kdm94YWxvdWQpLCBmaWxsID0gbGlzdChuID0gMCkpICU+JQogIHNwcmVhZChnb2R2b3hhbG91ZCwgbikgJT4lCiAgbXV0YXRlKHRvdGFsID0gbm8gKyBtYXliZSArIHllcykgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkgJT4lCiAgbXV0YXRlX2F0KHZhcnMobm8sIG1heWJlLCB5ZXMpLCBmdW5zKHJvdW5kKC4vdG90YWwsIDIpKjEwMCkpICU+JQogIHNlbGVjdCgtdG90YWwpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICBtdXRhdGVfYXQodmFycyhubywgbWF5YmUsIHllcyksIGZ1bnMocGFzdGUwKC4sICIlIikpKSAlPiUKICBrYWJsZSgpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyg2LCBib2xkID0gVCkKYGBgCgpgYGB7cn0KZDFfYnlxdWVzdGlvbiAlPiUgCiAgZmlsdGVyKCFpcy5uYShnb2R2aWF2aXNpb25zKSkgJT4lCiAgY291bnQoY291bnRyeSwgZ29kdmlhdmlzaW9ucykgJT4lIAogIG11dGF0ZShnb2R2aWF2aXNpb25zID0gcmVjb2RlX2ZhY3Rvcihnb2R2aWF2aXNpb25zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiID0gIm5vIiwgIjAuNSIgPSAibWF5YmUiLCAiMSIgPSAieWVzIikpICU+JQogIGNvbXBsZXRlKGNvdW50cnksIG5lc3RpbmcoZ29kdmlhdmlzaW9ucyksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgc3ByZWFkKGdvZHZpYXZpc2lvbnMsIG4pICU+JQogIG11dGF0ZSh0b3RhbCA9IG5vICsgbWF5YmUgKyB5ZXMpICU+JQogIGphbml0b3I6OmFkb3JuX3RvdGFscygpICU+JQogIG11dGF0ZV9hdCh2YXJzKG5vLCBtYXliZSwgeWVzKSwgZnVucyhyb3VuZCguL3RvdGFsLCAyKSoxMDApKSAlPiUKICBzZWxlY3QoLXRvdGFsKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgbXV0YXRlX2F0KHZhcnMobm8sIG1heWJlLCB5ZXMpLCBmdW5zKHBhc3RlMCguLCAiJSIpKSkgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoNiwgYm9sZCA9IFQpCmBgYAoKCiMgVE1MJ3MgYWRkaXRpb25hbCBhbmFseXNlcwoKIyMgRm9jdXMgb24gYGdvZHZveGFsb3VkYCBhbmQgYGdvZHZpYXZpc2lvbnNgCgpgYGB7cn0KZDFfdG1sMSA8LSBkMSAlPiUgc2VsZWN0KGNvdW50cnksIHN1YmplY3RfaWQsIGFic19zY29yZSwgcG9yX3Njb3JlKSAlPiUKICBmdWxsX2pvaW4oZDFfYnlxdWVzdGlvbiAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNvdW50cnksIHN1YmplY3RfaWQsIGdvZHZveGFsb3VkLCBnb2R2aWF2aXNpb25zKSAlPiUKICAgICAgICAgICAgICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCAtYyhjb3VudHJ5LCBzdWJqZWN0X2lkKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHJlc3BvbnNlX3luID0gY2FzZV93aGVuKHJlc3BvbnNlIDwgMSB+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID09IDEgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfcmVhbF8pKSkKYGBgCgpgYGB7cn0KZ2xtZXIocmVzcG9uc2VfeW4gfiBzY2FsZShwb3Jfc2NvcmUpICsgKDEgfCBxdWVzdGlvbikgKyAoMSB8IGNvdW50cnkpLCAKICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgZDFfdG1sMSkgJT4lIHN1bW1hcnkoKQpgYGAKCmBgYHtyfQpnbG1lcihyZXNwb25zZV95biB+IHNjYWxlKGFic19zY29yZSkgKyAoMSB8IHF1ZXN0aW9uKSArICgxIHwgY291bnRyeSksIAogICAgICBmYW1pbHkgPSAiYmlub21pYWwiLCBkMV90bWwxKSAlPiUgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmdsbWVyKHJlc3BvbnNlX3luIH4gc2NhbGUocG9yX3Njb3JlKSArICgxIHwgY291bnRyeSksIAogICAgICBmYW1pbHkgPSAiYmlub21pYWwiLCBkMV90bWwxICU+JSBmaWx0ZXIocXVlc3Rpb24gPT0gImdvZHZveGFsb3VkIikpICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KZ2xtZXIocmVzcG9uc2VfeW4gfiBzY2FsZShhYnNfc2NvcmUpICsgKDEgfCBjb3VudHJ5KSwgCiAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIGQxX3RtbDEgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiZ29kdm94YWxvdWQiKSkgJT4lIAogIHN1bW1hcnkoKQpgYGAKCmBgYHtyfQpnbG1lcihyZXNwb25zZV95biB+IHNjYWxlKHBvcl9zY29yZSkgKyAoMSB8IGNvdW50cnkpLCAKICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgZDFfdG1sMSAlPiUgZmlsdGVyKHF1ZXN0aW9uID09ICJnb2R2aWF2aXNpb25zIikpICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KZ2xtZXIocmVzcG9uc2VfeW4gfiBzY2FsZShhYnNfc2NvcmUpICsgKDEgfCBjb3VudHJ5KSwgCiAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIGQxX3RtbDEgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiZ29kdmlhdmlzaW9ucyIpKSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKIyMgRm9jdXMgb24gb3RoZXIgcHJlc2VuY2UgcXVlc3Rpb25zCgpgYGB7cn0KZDFfdG1sMiA8LSBkMSAlPiUgc2VsZWN0KGNvdW50cnksIHN1YmplY3RfaWQsIGFic19zY29yZSwgcG9yX3Njb3JlKSAlPiUKICBmdWxsX2pvaW4oZDFfYnlxdWVzdGlvbiAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNvdW50cnksIHN1YmplY3RfaWQsIG5lYXJ0YW5naWJsZWdvZCwgcHJlc2VuY2Vub3Rnb2QsIAogICAgICAgICAgICAgICAgICAgICBwcmVzZW5jZWRlbW9uLCBiZWluZ2VudGJvZHksIHNlZWhlYXJub3Rnb2QsIAogICAgICAgICAgICAgICAgICAgICBzcGlyaXRiZWluZ2VuY291bnRlcikgJT4lCiAgICAgICAgICAgICAgZ2F0aGVyKHF1ZXN0aW9uLCByZXNwb25zZSwgLWMoY291bnRyeSwgc3ViamVjdF9pZCkpICU+JQogICAgICAgICAgICAgIG11dGF0ZShyZXNwb25zZV95biA9IGNhc2Vfd2hlbihyZXNwb25zZSA8IDEgfiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9PSAxIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX3JlYWxfKSkpCmBgYAoKYGBge3J9CmdsbWVyKHJlc3BvbnNlX3luIH4gc2NhbGUocG9yX3Njb3JlKSArICgxIHwgcXVlc3Rpb24pICsgKDEgfCBjb3VudHJ5KSwgCiAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIGQxX3RtbDIpICU+JSBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KZ2xtZXIocmVzcG9uc2VfeW4gfiBzY2FsZShhYnNfc2NvcmUpICsgKDEgfCBxdWVzdGlvbikgKyAoMSB8IGNvdW50cnkpLCAKICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgZDFfdG1sMikgJT4lIHN1bW1hcnkoKQpgYGAKCgojIEN1bHR1cmFsIGludml0YXRpb24gdnMuIGluZGl2aWR1YWwgZGlmZmVyZW5jZQoKIyMgQW1vdW50IG9mIHZhcmlhYmlsaXR5IGVhY2ggcHJlZGljdG9yLCB3aXRoaW4gZWFjaCBzaXRlCgpgYGB7cn0KZDFfdmFyaWFuY2UgPC0gZDEgJT4lIAogIHNlbGVjdChjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbiwgc3ViamVjdF9pZCwgYWJzX3Njb3JlLCBwb3Jfc2NvcmUpICU+JQogIGdhdGhlcih2YXIsIHNjb3JlLCBlbmRzX3dpdGgoIl9zY29yZSIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lCiAgbXV0YXRlKHNjb3JlX3Jlc2NhbGVkID0gY2FzZV93aGVuKHZhciA9PSAiYWJzX3Njb3JlIiB+IHNjb3JlLzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciA9PSAicG9yX3Njb3JlIiB+IHNjb3JlLzMpKSAjIGNhbGxlZCBwdl9zY29yZSBpbiBzdHVkeSA0CmBgYAoKYGBge3J9CmJhcnRsZXR0LnRlc3Qoc2NvcmVfcmVzY2FsZWQgfiB2YXIsIAogICAgICAgICAgICAgIGRhdGEgPSBkMV92YXJpYW5jZSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlVTIikpCgpkMV92YXJpYW5jZSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gIlVTIikgJT4lCiAgZ3JvdXBfYnkodmFyKSAlPiUKICBzdW1tYXJpc2UodmFyaWFuY2UgPSB2YXIoc2NvcmVfcmVzY2FsZWQpKQpgYGAKCmBgYHtyfQpiYXJ0bGV0dC50ZXN0KHNjb3JlX3Jlc2NhbGVkIH4gdmFyLCAKICAgICAgICAgICAgICBkYXRhID0gZDFfdmFyaWFuY2UgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpKQoKZDFfdmFyaWFuY2UgJT4lIAogIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpICU+JQogIGdyb3VwX2J5KHZhcikgJT4lCiAgc3VtbWFyaXNlKHZhcmlhbmNlID0gdmFyKHNjb3JlX3Jlc2NhbGVkKSkKYGBgCgpgYGB7cn0KYmFydGxldHQudGVzdChzY29yZV9yZXNjYWxlZCB+IHZhciwgCiAgICAgICAgICAgICAgZGF0YSA9IGQxX3ZhcmlhbmNlICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSkKCmQxX3ZhcmlhbmNlICU+JSAKICBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSAlPiUKICBncm91cF9ieSh2YXIpICU+JQogIHN1bW1hcmlzZSh2YXJpYW5jZSA9IHZhcihzY29yZV9yZXNjYWxlZCkpCmBgYAoKYGBge3J9CmJhcnRsZXR0LnRlc3Qoc2NvcmVfcmVzY2FsZWQgfiB2YXIsIAogICAgICAgICAgICAgIGRhdGEgPSBkMV92YXJpYW5jZSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkNoaW5hIikpCgpkMV92YXJpYW5jZSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gIkNoaW5hIikgJT4lCiAgZ3JvdXBfYnkodmFyKSAlPiUKICBzdW1tYXJpc2UodmFyaWFuY2UgPSB2YXIoc2NvcmVfcmVzY2FsZWQpKQpgYGAKCmBgYHtyfQpiYXJ0bGV0dC50ZXN0KHNjb3JlX3Jlc2NhbGVkIH4gdmFyLCAKICAgICAgICAgICAgICBkYXRhID0gZDFfdmFyaWFuY2UgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJWYW51YXR1IikpCgpkMV92YXJpYW5jZSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gIlZhbnVhdHUiKSAlPiUKICBncm91cF9ieSh2YXIpICU+JQogIHN1bW1hcmlzZSh2YXJpYW5jZSA9IHZhcihzY29yZV9yZXNjYWxlZCkpCmBgYAoKYGBge3J9CmQxX3ZhcmlhbmNlICU+JSAKICBncm91cF9ieSh2YXIsIGNvdW50cnkpICU+JQogIHN1bW1hcmlzZSh2YXJpYW5jZSA9IHZhcihzY29yZV9yZXNjYWxlZCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzcHJlYWQodmFyLCB2YXJpYW5jZSkgJT4lCiAgcmVuYW1lKENvdW50cnkgPSBjb3VudHJ5LCBBYnNvcnB0aW9uID0gYWJzX3Njb3JlLCAKICAgICAgICAgYFBvcm9zaXR5IFZpZ25ldHRlc2AgPSBwb3Jfc2NvcmUpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42fQpkMV92YXJpYW5jZSAlPiUKICBncm91cF9ieSh2YXIsIGNvdW50cnkpICU+JQogIG11dGF0ZShzY29yZV9jZW50ID0gc2NhbGUoc2NvcmVfcmVzY2FsZWQsIHNjYWxlID0gRikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodmFyID0gcmVjb2RlX2ZhY3Rvcih2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcl9zY29yZSIgPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJzX3Njb3JlIiA9ICJBYnNvcnB0aW9uIikpICU+JQogIGdncGxvdChhZXMoeCA9IHNjb3JlX2NlbnQsIGZpbGwgPSB2YXIsIGNvbG9yID0gdmFyLCBsdHkgPSB2YXIpKSArCiAgZmFjZXRfd3JhcChjb3VudHJ5IH4gLiwgbmNvbCA9IDMpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjEpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygxLCAyKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgbGFicyh4ID0gIlNjb3JlIChyZXNjYWxlZCB0byBydW4gZnJvbSAwLTEsIGNlbnRlcmVkIGF0IHRoZSBtZWFuIGJ5IGNvdW50cnkpIiwKICAgICAgIGNvbG9yID0gIlNjYWxlIiwgZmlsbCA9ICJTY2FsZSIsIGx0eSA9ICJTY2FsZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuOH0KZDFfdmFyaWFuY2UgJT4lCiAgZ3JvdXBfYnkodmFyLCBjb3VudHJ5LCBzaXRlLCByZWxpZ2lvbikgJT4lCiAgbXV0YXRlKHNjb3JlX2NlbnQgPSBzY2FsZShzY29yZV9yZXNjYWxlZCwgc2NhbGUgPSBGKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh2YXIgPSByZWNvZGVfZmFjdG9yKHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9yX3Njb3JlIiA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnNfc2NvcmUiID0gIkFic29ycHRpb24iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2NvcmVfY2VudCwgZmlsbCA9IHZhciwgY29sb3IgPSB2YXIsIGx0eSA9IHZhcikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGNvdW50cnkpLCByb3dzID0gdmFycyhzaXRlLCByZWxpZ2lvbikpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjEpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygxLCAyKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgbGFicyh4ID0gIlNjb3JlIChyZXNjYWxlZCB0byBydW4gZnJvbSAwLTEsIGNlbnRlcmVkIGF0IHRoZSBtZWFuIGJ5IGNvdW50cnkpIiwKICAgICAgIGNvbG9yID0gIlNjYWxlIiwgZmlsbCA9ICJTY2FsZSIsIGx0eSA9ICJTY2FsZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgojIyBWYXJpYW5jZSBhY2NvdW50ZWQgZm9yIGJ5IGNvdW50cnkKCmBgYHtyfQpyNyA8LSBsbShwb3Jfc2NvcmVfc3RkIH4gY291bnRyeSwgZDEpCnJlZ3RhYl9mdW4ocjcsIGNvdW50cnlfdmFyMSA9ICJjb3VudHJ5X2doIiwgY291bnRyeV92YXIyID0gImNvdW50cnlfdGgiLCBjb3VudHJ5X3ZhcjMgPSAiY291bnRyeV9jaCIsIGNvdW50cnlfdmFyNCA9ICJjb3VudHJ5X3Z0IikKcnNxdWFyZWQocjcpCmBgYAoKYGBge3J9CnI5IDwtIGxtKGFic19zY29yZV9zdGQgfiBjb3VudHJ5LCBkMSkKcnNxdWFyZWQocjkpCmBgYAoKCgoK